home *** CD-ROM | disk | FTP | other *** search
-
- #include <mp.h>
- gcd(a,b,c) MINT *a,*b,*c;
- { MINT x,y,z,w;
- x.len=y.len=z.len=w.len=0;
- move(a,&x);
- move(b,&y);
- while(y.len!=0)
- { mdiv(&x,&y,&w,&z);
- move(&y,&x);
- move(&z,&y);
- }
- move(&x,c);
- xfree(&x);
- xfree(&y);
- xfree(&z);
- xfree(&w);
- return;
- }
- invert(a, b, c) MINT *a, *b, *c;
- { MINT x, y, z, w, Anew, Aold;
- int i = 0;
- x.len = y.len = z.len = w.len = Aold.len = 0;
- Anew.len = 1;
- Anew.val = xalloc(1);
- *Anew.val = 1;
- move(b, &x);
- move(a, &y);
- while(y.len != 0)
- { mdiv(&x, &y, &w, &z);
- move(&Anew, &x);
- mult(&w, &Anew, &Anew);
- madd(&Anew, &Aold, &Anew);
- move(&x, &Aold);
- move(&y, &x);
- move(&z, &y);
- i++;
- }
- move(&Aold, c);
- if( (i&01) == 0) msub(b, c, c);
- xfree(&x);
- xfree(&y);
- xfree(&z);
- xfree(&w);
- xfree(&Aold);
- xfree(&Anew);
- }
- 63% xfree(&x);
- xfree(&y);
- xfree(&z);
- xfree(&w);
- xfree(&Aold);
-